/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Entities;

import Connection.Koneksi;
import Controller.Add_Controller;
import com.sun.crypto.provider.RSACipher;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Tea-Nose
 */
public class Kendaraan {
//    Atribut data_kendaraan:
//1.	no_polisi* : String
//2.	merk_kendaraan: String
//3.	tipe_kendaraan : String
//4.	warna_kendaraan : String
//5.	Status_kedaraan:String
//6.	Spesifikasi_kendaraan : String
//

    private String no_polisi;
    private String merk_kendaraan;
    private String tipe_kendaraan;
    private String warna_kendaraan;
    private String status_kendaraan;
    private String spesifikasi_kendaraan;
    private String tanggal_servis;
    private String tanggal_kembali;
    private String kode_servis;
    private double harga_Sewa_Per_Hari;
    Connection connection = null;
    String no_polisi_pattern = "[a-zA-Z]{1,2}[0-9]{1,4}[a-zA-z]{1,3}";
    String merk_kendaraan_pattern = "[a-zA-Z0-9\\W]*";
    String warna_kendaraan_pattern = "[a-zA-Z]*";
    String harga_sewa_per_hari_pattern = "[0-9]*";
    
    public Kendaraan() {
    }
    
    public void setTanggal_kembali(String tgl_kembali) {
        this.tanggal_kembali = tgl_kembali;
    }
    
    public String getTanggal_kembali() {
        return tanggal_kembali;
    }
    
    public Kendaraan(String no_polisi, String merk_kendaraan, String tipe_kendaraan, String warna_kendaraan, String status_kedaraan, String spesifikasi_kendaraan) {
        this.no_polisi = no_polisi;
        this.merk_kendaraan = merk_kendaraan;
        this.tipe_kendaraan = tipe_kendaraan;
        this.warna_kendaraan = warna_kendaraan;
        this.status_kendaraan = status_kedaraan;
        this.spesifikasi_kendaraan = spesifikasi_kendaraan;
    }

    /**
     * @return the no_polisi
     */
    public String getNo_polisi() {
        return no_polisi;
    }

    /**
     * @param no_polisi the no_polisi to set
     */
    public void setNo_polisi(String no_polisi) throws Exception {
        if (no_polisi.matches(no_polisi_pattern)) {
            this.no_polisi = no_polisi.toUpperCase();
        } else {
            throw new Exception("Format no polisi:\n(1-2karakterhuruf)(1-4karakterangka)(1-2karakterhuruf)");
        }
    }

    /**
     * @return the merk_kendaraan
     */
    public String getMerk_kendaraan() {
        return merk_kendaraan;
    }

    /**
     * @param merk_kendaraan the merk_kendaraan to set
     */
    public void setMerk_kendaraan(String merk_kendaraan) throws Exception {
        if (merk_kendaraan.matches(merk_kendaraan_pattern)) {
            this.merk_kendaraan = merk_kendaraan.toUpperCase();
        } else {
            throw new Exception("merk kendaraan harus berisi karakter huruf");
        }
    }

    /**
     * @return the tipe_kendaraan
     */
    public String getTipe_kendaraan() {
        return tipe_kendaraan;
    }

    /**
     * @param tipe_kendaraan the tipe_kendaraan to set
     */
    public void setTipe_kendaraan(String tipe_kendaraan) {
        this.tipe_kendaraan = tipe_kendaraan.toUpperCase();
    }

    /**
     * @return the warna_kendaraan
     */
    public String getWarna_kendaraan() {
        return warna_kendaraan;
    }

    /**
     * @param warna_kendaraan the warna_kendaraan to set
     */
    public void setWarna_kendaraan(String warna_kendaraan) throws Exception {
        if (warna_kendaraan.matches(warna_kendaraan_pattern)) {
            this.warna_kendaraan = warna_kendaraan.toUpperCase();
        } else {
            throw new Exception("warna kendaraan harus berupa karakter huruf");
        }
    }

    /**
     * @return the status_kendaraan
     */
    public String getStatus_kendaraan() {
        return status_kendaraan;
    }

    /**
     * @param status_kendaraan the status_kendaraan to set
     */
    public void setStatus_kendaraan(String status_kendaraan) {
        this.status_kendaraan = status_kendaraan.toUpperCase();
    }

    /**
     * @return the spesifikasi_kendaraan
     */
    public String getSpesifikasi_kendaraan() {
        return spesifikasi_kendaraan;
    }

    /**
     * @param spesifikasi_kendaraan the spesifikasi_kendaraan to set
     */
    public void setSpesifikasi_kendaraan(String spesifikasi_kendaraan) {
        this.spesifikasi_kendaraan = spesifikasi_kendaraan;
    }
    
    public void getDataKendaraanBasedOnMerk(String merk) throws SQLException {
        
        String query = "select * from KENDARAAN where merk_kendaraan='" + merk + "'";
        ResultSet rset = Koneksi.select(query);
        
        while (rset.next()) {
            try {
                setNo_polisi(rset.getString("NO_POLISI"));
                setMerk_kendaraan(rset.getString("MERK_KENDARAAN"));
                setTipe_kendaraan(rset.getString("TIPE_KENDARAAN"));
                setWarna_kendaraan(rset.getString("WARNA_KENDARAAN"));
                setStatus_kendaraan(rset.getString("STATUS_KENDARAAN"));
                setSpesifikasi_kendaraan(rset.getString("SPESIFIKASI_KENDARAAN"));
                setHarga_Sewa_Per_Hari(Double.parseDouble(rset.getString("HARGA_SEWA_PER_HARI")));
            } catch (Exception ex) {
                Logger.getLogger(Kendaraan.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    public void getDataKendaraanBasedOnNoPolisi(String noPolisi) throws SQLException {
        String query = "select * from KENDARAAN where no_polisi='" + noPolisi + "'";
        ResultSet rset = Koneksi.select(query);
        while (rset.next()) {
            try {
                setNo_polisi(rset.getString("NO_POLISI"));
                setMerk_kendaraan(rset.getString("MERK_KENDARAAN"));
                setTipe_kendaraan(rset.getString("TIPE_KENDARAAN"));
                setWarna_kendaraan(rset.getString("WARNA_KENDARAAN"));
                setStatus_kendaraan(rset.getString("STATUS_KENDARAAN"));
                setSpesifikasi_kendaraan(rset.getString("SPESIFIKASI_KENDARAAN"));
                setHarga_Sewa_Per_Hari(Double.parseDouble(rset.getString("HARGA_SEWA_PER_HARI")));
            } catch (Exception ex) {
                Logger.getLogger(Kendaraan.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    public void changeStatusKendaraan() throws SQLException {
        String query = "UPDATE Kendaraan set status_kendaraan ='" + status_kendaraan
                + "'where no_polisi ='" + no_polisi+"'";
        Koneksi.updateData(query);
    }
    
    public void changeStatusKendaraanToSewa(String noPolisi) throws SQLException {
        String query = "UPDATE Kendaraan set status_kendaraan = 'SEWA' where no_polisi = '" + noPolisi + "'";
        Koneksi.updateData(query);
    }

    /**
     * @return the tanggal_servis
     */
    public String getTanggal_servis() {
        return tanggal_servis;
    }

    /**
     * @param tanggal_servis the tanggal_servis to set
     */
    public void setTanggal_servis(String tanggal_servis) {
        this.tanggal_servis = tanggal_servis;
    }
    
    public void insertNewKendaraan() {
        try {
            String query = "INSERT INTO KENDARAAN(no_polisi,merk_kendaraan,tipe_kendaraan,warna_kendaraan,spesifikasi_kendaraan,status_kendaraan,harga_sewa_per_hari) VALUES('"
                    + getNo_polisi() + "','" + getMerk_kendaraan() + "','" + getTipe_kendaraan() + "','" + getWarna_kendaraan() + "','"
                    + getSpesifikasi_kendaraan() + "','" + getStatus_kendaraan() + "','" + (long) getHarga_Sewa_Per_Hari() + "')";
            Koneksi.updateData(query);
        } catch (SQLException ex) {
            Logger.getLogger(Sewa.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public String cariKendaraanKembaliServis(Kendaraan kendaraan) {
        String stat = "";
        try {
            String query = "Select * from kendaraan where status_kendaraan = 'SERVIS' and no_polisi='" + kendaraan.getNo_polisi() + "'";
            String query2 = "Select * from servis where no_polisi ='" + kendaraan.getNo_polisi() + "' and biaya_servis is null";
            ResultSet resultSet = Koneksi.select(query);
            ResultSet resultSet1 = Koneksi.select(query2);
            
            resultSet.next();
            resultSet1.next();
            if (!resultSet.getString(1).matches("")) {
                kendaraan.setNo_polisi(resultSet.getString(1));
                kendaraan.setMerk_kendaraan(resultSet.getString(2));
                kendaraan.setTipe_kendaraan(resultSet.getString(3));
                kendaraan.setWarna_kendaraan(resultSet.getString(4));
                kendaraan.setSpesifikasi_kendaraan(resultSet.getString(5));
                kendaraan.setStatus_kendaraan(resultSet.getString(6));
                stat = resultSet1.getString(1);
            } else {
                JOptionPane.showMessageDialog(null, "No Polisi sedang tidak diservis atau No Polisi tidak terdaftar" + stat);
                stat = "";
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "No Polisi sedang tidak diservis atau No Polisi tidak terdaftar");
            stat = "";
        }
        return stat;
    }
    
    
    public void rubahStatServisChecker() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        Date date = new Date();
        String couter = sdf.format(date);
        try {
            String query = "select no_polisi from servis where tanggal_servis='" + couter + "' and biaya_servis is null";
            ResultSet set = Koneksi.select(query);
            while (set.next()) {
                String vNo_polisi = set.getString(1);
                String query2 = "UPDATE kendaraan set status_kendaraan='SERVIS' where no_polisi ='" + vNo_polisi + "' and status_kendaraan != 'SEWA'";
                Koneksi.updateData(query2);
                System.out.println(couter);
            }
        } catch (SQLException ex) {
            System.out.println("tidak ada perubahan status");
             System.out.println(couter);
        }
    }

    /**
     * @return the harga_Sewa_Per_Hari
     */
    public double getHarga_Sewa_Per_Hari() {
        return harga_Sewa_Per_Hari;
    }

    /**
     * @param harga_Sewa_Per_Hari the harga_Sewa_Per_Hari to set
     */
    public void setHarga_Sewa_Per_Hari(double harga_Sewa_Per_Hari) {
        this.harga_Sewa_Per_Hari = harga_Sewa_Per_Hari;
    }
    
    public long hargaSewaPerHariKendaraan(String no_polisi) throws SQLException {
        String query = "select harga_sewa_per_hari from kendaraan where no_polisi='" + no_polisi + "'";
        ResultSet rs = Koneksi.select(query);
        String hasilQuery = null;
        while (rs.next()) {
            hasilQuery = rs.getString(1);
        }
        return Long.parseLong(hasilQuery);

    }
    
    public ResultSet getMerkKendaraan(String no_polisi) throws SQLException {
        String query = "select merk_kendaraan from kendaraan where no_polisi='" + no_polisi + "'";
        ResultSet rs = Koneksi.select(query);
        return rs;

    }

    public String cekStatusKendaraan(String noPol) throws SQLException{
        String query = "select status_kendaraan from kendaraan where no_polisi='"+noPol+"'";
        ResultSet rs = Koneksi.select(query);
        String hasilQuery = null;
        while (rs.next()){
            hasilQuery=rs.getString(1);
        }
        return hasilQuery;
    }
}
